// 基础不牢 地动山摇 知其然知其所以然 给出解决办法
for (var index = 0; index < 3; index++) {
  setTimeout(function () {
    console.log(index)
  }, 1000)
}
console.log(index)
// var并没有自己的作用域，所以变量index是全局变量。输出for循环后的index = 3
// 主队列程序执行完才会去等待队列执行log(index)再等待一秒后执行剩余两条log(index)语句，此时index已经变成3了,所以立即输出3，一秒后输出3，3
// 所以当把for语句外的log移到for循环内，将输出0，1，2，3。一秒后输出3，3
// 要输出0,1,2  正确使用立即执行函数
for (var i = 0; i < 3; i++) {
  (function (x) {
    setTimeout(function () {
      console.log(x);
    })
  })(i)
}
console.log(i);  // 3,0,1,2
// 或者试下let
let i = 4
for (let i = 0; i < 3; i++) {
  setTimeout(function () {
    console.log(i);
  }, 1000)
}
console.log(i);
// let有独立作用域，for循环每次保存的是不同的i。for循环中使用let只在{}块级作用域内有效，所以不会影响全局中的i。




var a = 1;
var obj = {
  a: 2,
  test: function () {
    // console.log(this.a);
    setTimeout(function () { console.log(this.a); }, 1000);
  }
};
obj.test(); // 1
// 由于setTimeout() 方法是浏览器 window 对象提供的，因此第一个参数回调函数中的this其实是指向window对象，这跟变量的作用域有关。